
#ifndef __ui_base_tree_model_h__
#define __ui_base_tree_model_h__

#pragma once

#include <vector>

#include "base/string16.h"

class SkBitmap;

namespace ui
{

    class TreeModel;

    // TreeModelNode --------------------------------------------------------------

    // Type of class returned from the model.
    class TreeModelNode
    {
    public:
        // Returns the title for the node.
        virtual const string16& GetTitle() const = 0;

    protected:
        virtual ~TreeModelNode() {}
    };

    // Observer for the TreeModel. Notified of significant events to the model.
    class TreeModelObserver
    {
    public:
        // Notification that nodes were added to the specified parent.
        virtual void TreeNodesAdded(TreeModel* model,
            TreeModelNode* parent,
            int start,
            int count) = 0;

        // Notification that nodes were removed from the specified parent.
        virtual void TreeNodesRemoved(TreeModel* model,
            TreeModelNode* parent,
            int start,
            int count) = 0;

        // Notification that the contents of a node has changed.
        virtual void TreeNodeChanged(TreeModel* model, TreeModelNode* node) = 0;

    protected:
        virtual ~TreeModelObserver() {}
    };

    // TreeModel ------------------------------------------------------------------

    // The model for TreeView.
    class TreeModel
    {
    public:
        // Returns the root of the tree. This may or may not be shown in the tree,
        // see SetRootShown for details.
        virtual TreeModelNode* GetRoot() = 0;

        // Returns the number of children in |parent|.
        virtual int GetChildCount(TreeModelNode* parent) = 0;

        // Returns the child node of |parent| at |index|.
        virtual TreeModelNode* GetChild(TreeModelNode* parent, int index) = 0;

        // Returns the index of |child| in |parent|.
        virtual int GetIndexOf(TreeModelNode* parent, TreeModelNode* child) = 0;

        // Returns the parent of |node|, or NULL if |node| is the root.
        virtual TreeModelNode* GetParent(TreeModelNode* node) = 0;

        // Adds an observer of the model.
        virtual void AddObserver(TreeModelObserver* observer) = 0;

        // Removes an observer of the model.
        virtual void RemoveObserver(TreeModelObserver* observer) = 0;

        // Sets the title of |node|.
        // This is only invoked if the node is editable and the user edits a node.
        virtual void SetTitle(TreeModelNode* node, const string16& title);

        // Returns the set of icons for the nodes in the tree. You only need override
        // this if you don't want to use the default folder icons.
        virtual void GetIcons(std::vector<SkBitmap>* icons) {}

        // Returns the index of the icon to use for |node|. Return -1 to use the
        // default icon. The index is relative to the list of icons returned from
        // GetIcons.
        virtual int GetIconIndex(TreeModelNode* node);

    protected:
        virtual ~TreeModel() {}
    };

} //namespace ui

#endif //__ui_base_tree_model_h__